import getTreePropsDescrible from '../../utils/tree-props-desc';
import getRequestConfigDescrible from '../../utils/request-config-desc';

export default {
    attributes: [
        {
            params: 'filterable',
            des: '是否启用筛选；在 filter-by-front 不为 false 的情况下，组件内部的筛选均为前台筛选(前台根据节点名称模糊匹配)。 你也可以使用 filter-node-method 来自定义前台筛选节点的方法',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'filter-placeholder',
            des: '筛选框占位文字',
            type: 'String',
            values: '-',
            defaultVal: '\'输入关键字进行过滤\'',
        },
        {
            params: 'filter-button-text',
            des: '当配置 filter-by-front 为 false 时，会展示筛选按钮，该配置可以指定筛选按钮的文案',
            type: 'String',
            values: '-',
            defaultVal: '"查询"',
        },
        {
            params: 'filter-by-front',
            des: '是否为前端根据节点名称模糊匹配进行筛选，设置为 false 时，将禁用前端模糊筛选，并在点击查询按钮时抛出 search 回调方法',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'true',
        },
        {
            params: 'filter-node-method',
            des: '自定义组件内节点筛选规则，返回 true 表示这个节点可以显示，返回 false 则表示这个节点会被隐藏',
            type: 'Function(value, data, node)',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'selection',
            des: '设置默认选中；该属性为节点数据 data 组成的数组，或者为节点对应的 node-key 组成的数组；注意：若节点未启用勾选，且传入了 selection， 那么只有 selection 的第一个元素对应的节点会被选中并且高亮展示。',
            type: 'Array',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'request-config',
            des: '通过接口请求树数据的配置；详情请查阅下方说明',
            type: 'Object',
            values: '-',
            defaultVal: '-',
            details: [
                {
                    title: '配置项【request-config】',
                    describes: [
                        '除以下字段外，request-config 还支持传入axios的所有可配置参数，详细配置说明请查阅 https://github.com/axios/axios#request-config',
                    ],
                    configList: getRequestConfigDescrible('tree'),
                },
            ],
        },
        {
            params: 'data',
            des: '树数据',
            type: 'Array',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'empty-text',
            des: '内容为空的时候展示的文案',
            type: 'String',
            values: '-',
            defaultVal: '"暂无数据"',
        },
        {
            params: 'node-key',
            des: '树节点的唯一键，组件内部默认为 "id"',
            type: 'String',
            values: '-',
            defaultVal: '"id"',
        },
        {
            params: 'props',
            des: '配置选项，具体看下表',
            type: 'Object',
            values: '-',
            defaultVal: '-',
            details: [
                {
                    title: '配置项【props】',
                    describes: ['用于指定树节点相关功能性字段对应的字段编码'],
                    configList: getTreePropsDescrible(),
                },
            ],
        },
        {
            params: 'render-after-expand',
            des: '是否在第一次展开某个树节点后才渲染其子节点',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'true',
        },
        {
            params: 'lazy',
            des: '是否懒加载子节点，需与 load 方法结合使用',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'load',
            des: '加载子树数据的方法，仅当 lazy 属性为true 时生效；参数 node 为当前点击的节点，resolve 为数据加载完成的回调，需将子节点数据传入(必须调用)',
            type: 'Function(node, resolve)',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'render-content',
            des: '树节点的内容区的渲染 Function，可以通过该方法自定义节点内容区域的 dom',
            type: 'Function(h, { node, data, store })',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'highlight-current',
            des: '是否高亮当前选中节点',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'true',
        },
        {
            params: 'default-expand-all',
            des: '是否默认展开所有节点',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'expand-on-click-node',
            des: '是否在点击节点的时候展开或者收缩节点，如果为 false，则只有点箭头图标的时候才会展开或者收缩节点。',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'check-on-click-node',
            des: '若节点可勾选，是否在点击节点的时候选中节点，默认值为 false，即只有在点击复选框时才会选中节点。',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'default-expanded-keys',
            des: '默认展开的节点；属性值为节点对应的 node-key 组成的数组',
            type: 'Array',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'show-checkbox',
            des: '节点是否可被勾选，展示复选框',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'check-strictly',
            des: '在显示复选框的情况下，是否严格的遵循父子不互相关联的做法',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'accordion',
            des: '是否每次只打开一个同级树节点展开（手风琴模式）',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'indent',
            des: '树节点缩进',
            type: 'Number',
            values: '-',
            defaultVal: '18',
        },
        {
            params: 'icon',
            des: '自定义树节点的图标',
            type: 'String | Component',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'draggable',
            des: '是否开启拖拽节点功能',
            type: 'Boolean',
            values: 'true | false',
            defaultVal: 'false',
        },
        {
            params: 'allow-drag',
            des: '判断节点能否被拖拽 如果返回 false ，节点不能被拖动',
            type: 'Function(node)',
            values: '-',
            defaultVal: '-',
        },
        {
            params: 'allow-drop',
            des: '拖拽时判定目标节点能否成为拖动目标位置。 如果返回 false ，拖动节点不能被拖放到目标节点。 type 参数有三种情况：\'prev\'、\'inner\' 和 \'next\'，分别表示放置在目标节点前、插入至目标节点和放置在目标节点后',
            type: 'Function(draggingNode, dropNode, type)',
            values: '-',
            defaultVal: '-',
        },
    ],
    events: [
        {
            name: 'search',
            des: '点击筛选模块的 \'筛选\' 按钮时抛出的方法（需启用筛选，并且配置 filter-by-front 为 false）',
            params: '(keyword)',
        },
        {
            name: 'node-click',
            des: '当节点被点击的时候触发；四个参数：点击的节点数据、TreeNode 的 node 属性、TreeNode、以及事件对象',
            params: '(data, node, treeNode, event)',
        },
        {
            name: 'node-contextmenu',
            des: '当某一节点被鼠标右键点击时会触发该事件；共四个参数，依次为：event、对应节点的数据、节点对应的 Node、节点组件本身',
            params: '(event, data, node, vm)',
        },
        {
            name: 'check-change',
            des: '当复选框被点击的时候触发；共三个参数，依次为：对应节点的数据、节点本身是否被选中(Boolean)、节点的子树中是否有被选中的节点(Boolean)',
            params: '(data, selected, childrenSelected)',
        },
        {
            name: 'check',
            des: '点击节点复选框之后触发；共两个参数，依次为：对应节点的数据、树目前的选中状态对象(包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性)',
            params: '(data, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys })',
        },
        {
            name: 'current-change',
            des: '当前选中节点变化(高亮展示)时触发的事件；共两个参数，依次为：对应节点的数据，当前节点的 Node 对象',
            params: '(data, node)',
        },
        {
            name: 'node-expand',
            des: '节点被展开时触发的事件；共三个参数，依次为：对应节点的数据、节点对应的 Node、节点组件本身',
            params: '(data, node, vm)',
        },
        {
            name: 'node-collapse',
            des: '节点被关闭时触发的事件；共三个参数，依次为：对应节点的数据、节点对应的 Node、节点组件本身',
            params: '(data, node, vm)',
        },
        {
            name: 'node-drag-start',
            des: '节点开始拖拽时触发的事件；共两个参数，依次为：被拖拽节点对应的 Node、event',
            params: '(node, event)',
        },
        {
            name: 'node-drag-enter',
            des: '拖拽进入其他节点时触发的事件；共三个参数，依次为：被拖拽节点对应的 Node、所进入节点对应的 Node、event',
            params: '(dragNode, dropNode, event)',
        },
        {
            name: 'node-drag-leave',
            des: '拖拽离开某个节点时触发的事件；共三个参数，依次为：被拖拽节点对应的 Node、所离开节点对应的 Node、event',
            params: '(dragNode, leaveNode, event)',
        },
        {
            name: 'node-drag-over',
            des: '节点开始拖拽时触发的事件在拖拽节点时触发的事件（类似浏览器的 mouseover 事件）；共三个参数，依次为：被拖拽节点对应的 Node、当前进入节点对应的 Node、event',
            params: '(dragNode, overNode, event)',
        },
        {
            name: 'node-drag-end',
            des: '拖拽结束时（可能未成功）触发的事件；共四个参数，依次为：被拖拽节点对应的 Node、结束拖拽时最后进入的节点（可能为空）、被拖拽节点的放置位置（before、after、inner）、event',
            params: '(dragNode, dropNode, type, event)',
        },
        {
            name: 'node-drop',
            des: '拖拽成功完成时触发的事件；共四个参数，依次为：被拖拽节点对应的 Node、结束拖拽时最后进入的节点对应的 Node、被拖拽节点的放置位置（before、after、inner）、event',
            params: '(dragNode, dropNode, type, event)',
        },
    ],
    slots: [
        {
            name: '-',
            des: '默认插槽，可以自定义节点内容',
            params: '{ node, data }',
        },
        {
            name: 'empty',
            des: '当数据为空时自定义的内容',
            params: '-',
        },
    ],
    refs: [
        {
            name: 'filter',
            des: '手动触发筛选树节点的方法，接收一个 String 表示筛选的文案内容',
            params: '(text)',
            return: '-',
        },
        {
            name: 'toogleCheckedAll',
            des: '若节点可勾选，该方法可用于设置全选/反选，参数为布尔值',
            params: '(checked)',
            return: '-',
            version: '1.0.4',
        },
        {
            name: 'toogleNodeExpand',
            des: '设置某个节点的展开、折叠的状态; 第一个参数为节点的 key 或者节点数据，第二个参数为布尔值，表示折叠状态',
            params: '(key | data, checked)',
            return: '-',
            version: '1.0.4',
        },
        {
            name: 'toogleExpandAll',
            des: '设置全部展开、折叠的状态，参数为布尔值',
            params: '(checked)',
            return: '-',
            version: '1.0.4',
        },
        {
            name: 'updateKeyChildren',
            des: '为节点设置新数据，接收两个参数: 第一个为节点的 key，第二个为需要插入的新数据',
            params: '(key, data)',
            return: '-',
        },
        {
            name: 'getCheckedNodes',
            des: '若节点可被选择，它将回目前被选中的节点数据所组成的数组；该方法接收两个 boolean 类型的参数，默认值均为 false；第一个参数表示是否只返回该节点的叶子节点，第二个参数表示返回值是否包含半选节点',
            params: '(leafOnly = false, includeHalfChecked = false)',
            return: 'Array',
        },
        {
            name: 'setCheckedNodes',
            des: '设置目前勾选的节点，参数为节点数据组成的数组',
            params: '(nodes)',
            return: '-',
        },
        {
            name: 'getCheckedKeys',
            des: '若节点可被选择，它将返回当前选中节点 key 的数组；它接收一个布尔类型参数，默认为 false. 如果参数是 true, 它只返回当前选择的子节点数组',
            params: '(leafOnly)',
            return: 'Array',
        },
        {
            name: 'setCheckedKeys',
            des: '通过 keys 设置目前勾选的节点，setCheckedKeys([]) 表示清空所有节点的选中状态；第一个参数为勾选节点的 node-key 组成的数组，第二个参数若为 true 则仅设置子节点的选中状态，默认值为 false',
            params: '(keys, leafOnly)',
            return: '-',
        },
        {
            name: 'setChecked',
            des: '设置某个节点是否被选中；第一个参数为需要选中的节点的 node-key 或者数据，第二个控制是否选中(Boolean)，第三个参数表明是否递归选中子节点',
            params: '(key | data, checked, deep) ',
            return: '-',
        },
        {
            name: 'getHalfCheckedNodes',
            des: '若节点可被选择，它将返回目前半选中的节点数据所组成的数组',
            params: '-',
            return: 'Array',
        },
        {
            name: 'getHalfCheckedKeys',
            des: '若节点可被选择，它将返回目前半选中的节点对应的 node-key 所组成的数组',
            params: '-',
            return: 'Array',
        },
        {
            name: 'getCurrentKey',
            des: '返回当前被选中(高亮展示)的节点对应的 node-key (如果没有则返回 null)',
            params: '-',
            return: 'String | Number',
        },
        {
            name: 'getCurrentNode',
            des: '返回当前被选中(高亮展示)的节点对应的数据 (如果没有则返回 null)',
            params: '-',
            return: 'Object',
        },
        {
            name: 'setCurrentKey',
            des: '通过 node-key 设置某个节点的当前选中状态（高亮展示），若不传参数则取消当前已高亮展示的节点的高亮状态，第二个参数表示是否自动展开父节点，默认值为 true',
            params: '(nodeKey, shouldAutoExpandParent)',
            return: '-',
        },
        {
            name: 'setCurrentNode',
            des: '通过节点对应的数据 data 设置某个节点的当前选中状态（高亮展示），若不传参数则取消当前已高亮展示的节点的高亮状态，第二个参数表示是否自动展开父节点，默认值为 true',
            params: '(data, shouldAutoExpandParent)',
            return: '-',
        },
        {
            name: 'getNode',
            des: '根据 data 或者 key 拿到 Tree 组件中的 node',
            params: '(nodeKey | data)',
            return: '-',
        },
        {
            name: 'remove',
            des: '删除 Tree 中的一个节点，参数为要删除的节点的 data 或者 node 对象',
            params: '(data | node)',
            return: '-',
        },
        {
            name: 'append',
            des: '为 Tree 中的一个节点追加一个子节点；第一个参数为要插入的节点的数据 data，第二个为父节点的 data 或者 key 或者 node',
            params: '(data, parentNode)',
            return: '-',
        },
        {
            name: 'insertBefore',
            des: '在 Tree 中给定节点前插入一个节点；第一个参数为要插入的节点的数据 data，第二个为参考节点的 data 或者 key 或者 node',
            params: '(data, refNode)',
            return: '-',
        },
        {
            name: 'insertAfter',
            des: '在 Tree 中给定节点后插入一个节点；第一个参数为要插入的节点的数据 data，第二个为参考节点的 data 或者 key 或者 node',
            params: '(data, refNode)',
            return: '-',
        },
        {
            name: 'initTreeData',
            des: '重新获取树数据及初始化节点选中状态',
            params: '-',
            return: '-',
        },
    ],
};
